//
// Created by mazaiting on 2024/4/29.
//
#include <bits/stdc++.h>

using namespace std;

struct LinkNode                //链串结点类型
{
    char data;                    //存放一个字符
    LinkNode *next;                //指向下一个结点
    LinkNode() : next(nullptr) {}            //构造函数
    LinkNode(char d) : data(d), next(nullptr) {}    //重载构造函数
};

class LinkString        //链串类
{
public:                //为了简单将成员均设置为公有的
    LinkNode *head;        //链串头结点head
    int length;            //链串长度
    //串的基本运算算法

    LinkString &InsStr(int i, LinkString &t)    //串插入
    {
        static LinkString s;            //新建一个空串
        if (i < 0 || i > length) return s;    //参数不正确时返回空串
        LinkNode *p = head->next, *p1 = t.head->next;
        LinkNode *r = s.head, *q;    //r指向新建链表的尾结点
        for (int k = 0; k < i; k++)    //将当前链串的前i个结点复制到s
        {
            q = new LinkNode(p->data);        //新建结点q
            r->next = q;
            r = q;            //将结点q链接到尾部
            p = p->next;
        }
        while (p1 != nullptr)            //将t中所有结点复制到s
        {
            q = new LinkNode(p1->data);    //新建结点q
            r->next = q;
            r = q;            //将结点q链接到尾部
            p1 = p1->next;
        }
        while (p != nullptr)            //将p及其后的结点复制到s
        {
            q = new LinkNode(p->data);    //新建结点q
            r->next = q;
            r = q;            //将结点q链接到尾部
            p = p->next;
        }

        s.length = length + t.length;
        r->next = nullptr;            //尾结点的next置为空
        return s;                //返回新建的链串
    }


};

